home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- from __future__ import generators
- from threading import Lock
-
- class ResponsibleGenerator(object):
- '''A generator that will help clean up when it is done being used.'''
- __slots__ = [
- 'cleanup',
- 'gen']
-
- def __init__(self, gen, cleanup):
- self.cleanup = cleanup
- self.gen = gen
-
-
- def __del__(self):
- self.cleanup()
-
-
- def __iter__(self):
- return self
-
-
- def next(self):
- return self.gen.next()
-
-
-
- class Concurrent(object):
-
- def __init__(self, store):
- self.store = store
- self._Concurrent__visit_count = 0
- self._Concurrent__lock = Lock()
- self._Concurrent__pending_removes = []
- self._Concurrent__pending_adds = []
-
-
- def add(self, .1):
- (s, p, o) = .1
- if self._Concurrent__visit_count == 0:
- self.store.add((s, p, o))
- else:
- self._Concurrent__pending_adds.append((s, p, o))
-
-
- def remove(self, .1):
- (subject, predicate, object) = .1
- if self._Concurrent__visit_count == 0:
- self.store.remove((subject, predicate, object))
- else:
- self._Concurrent__pending_removes.append((subject, predicate, object))
-
-
- def triples(self, .1):
- (subject, predicate, object) = .1
- g = self.store.triples((subject, predicate, object))
- pending_removes = self._Concurrent__pending_removes
- self._Concurrent__begin_read()
- for s, p, o in ResponsibleGenerator(g, self._Concurrent__end_read):
- if (s, p, o) not in pending_removes:
- yield (s, p, o)
- continue
-
- for s, p, o in self._Concurrent__pending_adds:
- if subject == None or subject == s:
- if predicate == None or predicate == p:
- if object == None or object == o:
- yield (s, p, o)
- continue
-
-
-
- def __len__(self):
- return self.store.__len__()
-
-
- def __begin_read(self):
- lock = self._Concurrent__lock
- lock.acquire()
- self._Concurrent__visit_count = self._Concurrent__visit_count + 1
- lock.release()
-
-
- def __end_read(self):
- lock = self._Concurrent__lock
- lock.acquire()
- self._Concurrent__visit_count = self._Concurrent__visit_count - 1
- if self._Concurrent__visit_count == 0:
- pending_removes = self._Concurrent__pending_removes
- while pending_removes:
- (s, p, o) = pending_removes.pop()
-
- try:
- self.store.remove((s, p, o))
- continue
- print s, p, o, 'Not in store to remove'
- continue
-
- pending_adds = self._Concurrent__pending_adds
- while pending_adds:
- (s, p, o) = pending_adds.pop()
- self.store.add((s, p, o))
-
- lock.release()
-
-
-